package com.sxf.core.validator;

import org.apache.commons.lang3.StringUtils;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/**
 * 
 * @description: 字符判定校验实现
 * @author: zhangyb@ccccit.com.cn 
 * @date: 2021年1月6日 下午2:52:36
 */
public class AllowedStringValidator implements ConstraintValidator<AllowedString, String>{
    
    private boolean checkNull;

    private Class<? extends ValidStringType> validStringTypeClass;

    private String[] allowedValues;

    @Override
    public void initialize(AllowedString constraintAnnotation) {
        this.validStringTypeClass = constraintAnnotation.allowedEnumClass();
        this.checkNull = constraintAnnotation.checkNull();
        this.allowedValues = constraintAnnotation.values();
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        //如果不判空，值为空时返回
    	if(!checkNull && StringUtils.isBlank(value)) {
			return true;
		}

    	if(StringUtils.isBlank(value)) {
    		return false;
    	}
    	//判断是否是枚举（符合直接返回true）
    	if (validStringTypeClass.isEnum()){
            ValidStringType[] enumConstants = validStringTypeClass.getEnumConstants();
            for(ValidStringType enumConstant : enumConstants) {
                //获取每个常量的code值与入参比较
                if(enumConstant.getCode().equals(value)){
                    return true;
                }
            }
        }
        //判断字符数组中是否存在符合项（字符数组为空返回false）
        if (allowedValues == null || allowedValues.length == 0) {
            return false;
        }
        for(String allowedValue : allowedValues) {
            if(allowedValue.equals(value)){
                return true;
            }
        }
        return false;
    }

}
